#include "missions.h"


Missions::Missions(int nb_terr, int tps_min)
{
    min_pays = nb_terr;
    min_tours = tps_min ;

    min_armees_continent = 0;
    min_armees = 0 ;
    min_continents = 0 ;
    id_joueur_cible = -1 ;
    conquete = 0 ;
    continents_a_obtenir << 0 ;
}

Missions::Missions(int nb_terr, int min_arm, int tps_min)
{
    min_pays = nb_terr;
    min_tours = tps_min;
    min_armees = min_arm;

    min_armees_continent = 0;
    min_continents = 0 ;
    id_joueur_cible = -1 ;
    conquete = 0 ;
    continents_a_obtenir << 0 ;
}

Missions::Missions(int min_cont, QList<int> list_cont, int tps_min)
{
    min_continents = min_cont ;
    continents_a_obtenir = list_cont ;
    min_tours = tps_min ;
    LOG(ODEBUG, "liste id continents création mission : ");
    qDebug() << continents_a_obtenir;

    min_armees_continent = 0;
    id_joueur_cible = -1 ;
    conquete = 0 ;
    min_armees = 0 ;
    min_pays = 0 ;
}

Missions::Missions(int min_cont, QList<int> list_cont, int min_arm, int tps_min)
{
    min_continents = min_cont ;
    continents_a_obtenir = list_cont ;
    min_armees_continent = min_arm;
    min_tours = tps_min;

    min_armees = 0 ;
    min_pays = 0 ;
    id_joueur_cible = -1 ;
    conquete = 0 ;
}

Missions::Missions(int id_cible)
{
    id_joueur_cible = id_cible;

    min_armees_continent = 0 ;
    min_armees = 0 ;
    min_pays = 0 ;
    min_continents = 0 ;
    min_tours = 0 ;
    conquete = 0 ;
    continents_a_obtenir << 0 ;
}

// à placer dans plateauRisq ?
bool Missions::obj_18(PlateauRisQ *p, Joueur *j)
{
    if ( p->taille_min_armee(j, 18, 2) ) // && duree_acquisition >= min_tours
        return true;
    return false;
}

bool Missions::obj_24(PlateauRisQ *p, Joueur *j)
{
    if (p->nbr_etats_acquis(j) >= 24 )// && duree_acquisition >= min_tours
        return true;
    return false;
}

// une missions est accomplie en fonction du plateau où elle est
// on aurait pu aussi ajouter le pointeur du plateau à la création d'une mission.
bool Missions::est_accomplie(PlateauRisQ* p, Joueur* j)
{
    LOG(ODEBUG, "accomplie I");
    if (id_joueur_cible != -1)// c'est que la mission consiste à détruire quelqu'un
    {
        LOG(ODEBUG, "accomplie 1");
        // test de l'existence d'un joueur
        if (p->joueurs()[id_joueur_cible]->getVaincupar() == j->getId())
        {
            LOG(ODEBUG, "accomplie 1a");
            return true;
        }
        else if (p->joueurs()[id_joueur_cible]->getVaincupar() != -1)
        {
            LOG(ODEBUG, "accomplie 1b");
            return obj_24(p,j);
        }
    }
    else if (min_continents != 0) // mission continents à obtenir
    {
        LOG(ODEBUG, "accomplie 2");
        int nb_continents_acquis = 0;
        int nb_cont_specifies = continents_a_obtenir.count();
        foreach (Continent* c,  p->continents())
        {
            if (p->est_au_meme_joueur(c,j))
            {
                LOG(ODEBUG, "accomplie 2b");
                nb_continents_acquis++ ;
            }
            if ( p->est_au_meme_joueur(c,j) && continents_a_obtenir.contains(c->id) )
            {
                LOG(ODEBUG, "accomplie 2c");
                nb_cont_specifies--;
            }
        }

        if (nb_continents_acquis >= min_continents && nb_cont_specifies == 0)
        {
            LOG(ODEBUG, "accomplie 2d");
            return true ;
        }

    }
    else // if (min_pays != 0) quantité de pays à obtenir
    {
        LOG(ODEBUG, "accomplie 3");
        if (min_pays == 18)
        {
            LOG(ODEBUG, "accomplie 3a");
            return obj_18(p,j);
        }
        else if (min_pays == 24)
        {
            LOG(ODEBUG, "accomplie 3b");
            return obj_24(p,j);
        }
        else
        {
            LOG(ODEBUG, "soit une mission est mal initialisée, soit min_pays à conquérir != 18 et 24");
        }
    }

    return false;
}

